home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / strip.c < prev    next >
C/C++ Source or Header  |  1990-07-23  |  3KB  |  162 lines

  1. /* strip - remove symbols.        Author: Dick van Veen */
  2.  
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <a.out.h>
  7. #include <unistd.h>
  8. #include <string.h>
  9. #include <stdio.h>
  10.  
  11. /* Strip [file] ...
  12.  *
  13.  *    -    when no file is present, a.out is assumed.
  14.  *
  15.  */
  16.  
  17. #define A_OUT        "a.out"
  18. #define NAME_LENGTH    128    /* max file path name */
  19.  
  20. char buffer[BUFSIZ];        /* used to copy executable */
  21. char new_file[NAME_LENGTH];    /* contains name of temporary */
  22. struct exec header;
  23.  
  24. main(argc, argv)
  25. int argc;
  26. char **argv;
  27. {
  28.   argv++;
  29.   if (*argv == NULL)
  30.     strip(A_OUT);
  31.   else
  32.     while (*argv != NULL) {
  33.         strip(*argv);
  34.         argv++;
  35.     }
  36.   exit(0);
  37. }
  38.  
  39. strip(file)
  40. char *file;
  41. {
  42.   int fd, new_fd;
  43.   struct stat buf;
  44.   long symb_size, relo_size;
  45.  
  46.   fd = open(file, O_RDONLY);
  47.   if (fd == -1) {
  48.     fprintf(stderr, "can't open %s\n", file);
  49.     close(fd);
  50.     return;
  51.   }
  52.   if (read_header(fd)) {
  53.     fprintf(stderr, "%s: not an executable file\n", file);
  54.     close(fd);
  55.     return;
  56.   }
  57.   if (header.a_syms == 0L) {
  58.     close(fd);        /* no symbol table present */
  59.     return;
  60.   }
  61.   symb_size = header.a_syms;
  62.   header.a_syms = 0L;        /* remove table size */
  63.   fstat(fd, &buf);
  64.   relo_size = buf.st_size - (A_MINHDR + header.a_text + header.a_data + symb_size);
  65.   new_fd = make_tmp(new_file, file);
  66.   if (new_fd == -1) {
  67.     fprintf(stderr, "can't create temporary file\n");
  68.     close(fd);
  69.     return;
  70.   }
  71.   if (write_header(new_fd)) {
  72.     fprintf(stderr, "%s: can't write temporary file\n");
  73.     unlink(new_file);
  74.     close(fd);
  75.     close(new_fd);
  76.     return;
  77.   }
  78.   if (copy_file(fd, new_fd, header.a_text + header.a_data)) {
  79.     fprintf(stderr, "can't copy %s\n", file);
  80.     unlink(new_file);
  81.     close(fd);
  82.     close(new_fd);
  83.     return;
  84.   }
  85.   if (relo_size != 0) {
  86.     lseek(fd, symb_size, 1);
  87.     if (copy_file(fd, new_fd, relo_size)) {
  88.         fprintf(stderr, "can't copy %s\n", file);
  89.         unlink(new_file);
  90.         close(fd);
  91.         close(new_fd);
  92.         return;
  93.     }
  94.   }
  95.   close(fd);
  96.   close(new_fd);
  97.   if (unlink(file) == -1) {
  98.     fprintf(stderr, "can't unlink %s\n", file);
  99.     unlink(new_file);
  100.     return;
  101.   }
  102.   link(new_file, file);
  103.   unlink(new_file);
  104.   chmod(file, buf.st_mode);
  105. }
  106.  
  107. read_header(fd)
  108. int fd;
  109. {
  110.   if (read(fd, (char *) &header, A_MINHDR) != A_MINHDR) return(1);
  111.   if (BADMAG(header)) return (1);
  112.   if (header.a_hdrlen > sizeof(struct exec)) return (1);
  113.   lseek(fd, 0L, SEEK_SET);    /* variable size header */
  114.   if (read(fd, (char *)&header, (int)header.a_hdrlen) != (int) header.a_hdrlen)
  115.     return(1);
  116.   return(0);
  117. }
  118.  
  119. write_header(fd)
  120. int fd;
  121. {
  122.   lseek(fd, 0L, SEEK_SET);
  123.   if (write(fd, (char *)&header, (int)header.a_hdrlen) != (int)header.a_hdrlen)
  124.     return(1);
  125.   return(0);
  126. }
  127.  
  128. int make_tmp(new_name, name)
  129. char *new_name, *name;
  130. {
  131.   int len;
  132.   char *nameptr;
  133.  
  134.   len = strlen(name);
  135.   if (len + 1 > NAME_LENGTH) return(-1);
  136.   strcpy(new_name, name);
  137.   nameptr = strrchr(new_name, '/');
  138.   if (nameptr == NULL) nameptr = new_name - 1;
  139.   if (nameptr - new_name + 6 + 1 > NAME_LENGTH) return (-1);
  140.   strcpy(nameptr + 1, "XXXXXX");
  141.   mktemp(new_name);
  142.   return(creat(new_name, 0777));
  143. }
  144.  
  145. copy_file(fd1, fd2, size)
  146. int fd1, fd2;
  147. long size;
  148. {
  149.   int length;
  150.  
  151.   while (size > 0) {
  152.     if (size < sizeof(buffer))
  153.         length = size;
  154.     else
  155.         length = sizeof(buffer);
  156.     if (read(fd1, buffer, length) != length) return(1);
  157.     if (write(fd2, buffer, length) != length) return (1);
  158.     size -= length;
  159.   }
  160.   return(0);
  161. }
  162.